home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
m2
/
cat3src
/
cat
/
cathelp.i
< prev
next >
Wrap
Text File
|
1997-10-26
|
16KB
|
493 lines
IMPLEMENTATION MODULE CatHelp;
FROM SYSTEM IMPORT ADDRESS, ADR, CADR, TSIZE;
(* MM2 Module *)
IMPORT Lists;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
IMPORT GrafBase;
IMPORT FileNames;
(* CAT Module *)
IMPORT ListDl;
IMPORT CatTypes;
IMPORT ListHelp;
IMPORT MausTauschrsc;
IMPORT MTE;
IMPORT CatGlobal;
IMPORT CatFiles;
IMPORT dataSys;
IMPORT Varnames;
IMPORT ConfVars;
IMPORT Protokoll;
FROM Void IMPORT v;
(* MagicLib *)
IMPORT MagicAES, MagicStrings, MagicConvert;
IMPORT mtAppl;
IMPORT mtDials;
IMPORT mtTextfiles;
IMPORT mtUtils;
TYPE tHelpKeys = ARRAY [general..iofilter] OF ARRAY [0..39] OF CHAR;
CONST cHelpFile = 'cat.hlp';
cHelpIdx = 'cathelp.idx';
cHelpCode = '#(&)';
cHelpTable= tHelpKeys{'#(&)CAT',
'#(&)CATINFO',
'#(&)EDITOR',
'#(&)ANZEIGE',
'#(&)MESSAGES',
'#(&)STICHWORT',
'#(&)BUME',
'#(&)FORMATE',
'#(&)KONFIG',
'#(&)OPTIONS',
'#(&)TAUSCH',
'#(&)LISTCONF',
'#(&)SEARCHDIAL',
'#(&)SMALLSEARCH',
'#(&)FILTER',
'#(&)GROUPLIST',
'#(&)GROUPREAD',
'#(&)GROUPWRITE',
'#(&)GROUPUSER',
'#(&)INFOLOAD',
'#(&)INFOCHANGE',
'#(&)MAXIMALSIZE',
'#(&)SELECTGROUP',
'#(&)REGISTER',
'#(&)WIEDERVORLAGE',
'#(&)TEXTSEARCH',
'#(&)TEXTREPLACE',
'#(&)CHANGEMSG',
'#(&)ITKHELP',
'#(&)CONFIGINFILE',
'#(&)CONFIGEDITOR',
'#(&)IOFILTER'};
cGuideHelpTable= tHelpKeys{
'CAT - Das MausTausch-FrontEnd',
'Shareware',
'Der Editor',
'Die Nachrichtenanzeige',
'Kommentar ffnen',
'Die Stichwortliste',
'Die Baumanzeige',
'Formate',
'Konfiguration',
'Allgemein',
'Tauschoptionen',
'Stichwortliste',
'Der groe (kompliziertere) Suchdialog',
'Der kleine (einfachere) Suchdialog',
'Block filtern',
'Gruppen',
'Gruppen lesen',
'Neue ffentliche...',
'User an-/abstellen',
'Mausinfo laden',
'Infodateien',
'Maximalgre berschritten!',
'Gruppen auswhlen',
'Shareware',
'Wiedervorlage',
'Textsuche...',
'Text ersetzen',
'Kommentar ffnen',
'MausTausch-Kommandos',
'Infile konfigurieren',
'Editor',
'I/O-Filter'};
cHelpMagic = 43415448H; (* 'CATH' *)
cHelpVersion = 0100H;
cHelpVersionMagic = 020AH;
TYPE tHelpIdx = RECORD
helpSize : LONGCARD;
helpOffset : ARRAY [general..iofilter] OF LONGCARD;
END;
tHelpInfo = RECORD
l : Lists.List;
END;
tHelpPtr = POINTER TO tHelpInfo;
PROCEDURE buildIdx (REF path: ARRAY OF CHAR; size: LONGCARD;
f : mtTextfiles.TEXTFILE;
VAR helpIdx: tHelpIdx): BOOLEAN;
VAR helpName : CatTypes.String255;
skipString : CatTypes.String127;
helpKey : CatTypes.String127;
str : CatTypes.Str127Ptr;
i : tHelp;
found : BOOLEAN;
header : dataSys.FileHeaderType;
fi : INTEGER;
BEGIN
helpIdx.helpSize := size;
FOR i := general TO iofilter DO
helpIdx.helpOffset[i] := $FFFFFFFF;
END;
(* Jetzt alle Zeilen nach dem Key durchsuchen *)
LOOP
(* Zeilen bis zum Anfang des Helptextes berspringen *)
mtTextfiles.ReadLine(f, skipString);
IF mtTextfiles.EndofText (f) THEN EXIT END;
found := FALSE;
IF MagicStrings.Pos (cHelpCode, skipString, 0, FALSE) = 0
THEN
i := general;
LOOP
IF found THEN EXIT END;
IF MagicStrings.Pos (cHelpTable[i], skipString, 0, FALSE) < LENGTH (skipString)
THEN
(* Gefunden. In der nchsten Zeile geht es los *)
mtTextfiles.ReadLn (f);
(* Offset merken *)
helpIdx.helpOffset[i] := mtTextfiles.Textpos (f);
found := TRUE;
ELSE
IF i < MAX (tHelp)
THEN
INC (i);
ELSE
EXIT
END;
END;
END;
END;
IF ~found
THEN
mtTextfiles.ReadLn (f);
END;
IF mtTextfiles.EndofText (f) THEN EXIT END;
END;
mtTextfiles.Reset (f);
(* Jetzt den Hilfeindex schreiben *)
fi := CatFiles.CreateFile (path, cHelpIdx);
IF fi < 0
THEN
RETURN FALSE
END;
(* Fileheader aufbauen *)
header := dataSys.FileHeaderType {cHelpMagic, cHelpVersion, cHelpVersionMagic};
CatFiles.WriteMuch (dataSys.dbHeaderLength, fi, ADR(header));
CatFiles.WriteMuch (TSIZE (tHelpIdx), fi, ADR(helpIdx));
CatFiles.CloseFile (fi);
Protokoll.SendPathUpdate (path);
RETURN TRUE;
END buildIdx;
PROCEDURE readHelp (VAR text : Lists.List; which: tHelp): BOOLEAN;
VAR helpName : CatTypes.String255;
skipString : CatTypes.String127;
helpKey : CatTypes.String127;
str : CatTypes.Str127Ptr;
f : mtTextfiles.TEXTFILE;
header : dataSys.FileHeaderType;
fi : INTEGER;
helpSize : LONGCARD;
helpIdx : tHelpIdx;
path : CatTypes.String255;
name : CatTypes.nameStrType;
succ : BOOLEAN;
BEGIN
(* Lies Hilfe-Datei ein.
*)
CatGlobal.ApplPath (helpName);
MagicStrings.Append (cHelpFile, helpName);
mtAppl.MouseBusy();
IF ~mtTextfiles.OpenTextfile (helpName, mtTextfiles.READ, 8192, f)
THEN
MagicStrings.Assign (cHelpFile, helpName);
MagicAES.ShelFind (helpName);
IF ~mtTextfiles.OpenTextfile (helpName, mtTextfiles.READ, 8192, f)
THEN
mtAppl.MouseArrow();
MTE.InfoAlert (MTE.noFile1, cHelpFile, MTE.noFile4);
RETURN FALSE;
END;
END;
(* Gre der Hilfedatei feststellen *)
helpSize := CatFiles.FileSize (helpName, v.bool);
(* Jetzt nachsehen, ob wir auch eine Indexdatei haben. Wenn nein,
* dann wird die jetzt aufgebaut
*)
FileNames.SplitPath (helpName, path, name);
fi := CatFiles.OpenFile (path, cHelpIdx, CatFiles.readFile);
IF fi < 0
THEN
(* Kein Index vorhanden, also aufbauen *)
succ := buildIdx (path, helpSize, f, helpIdx);
ELSE
(* Erstmal Header lesen und prfen *)
CatFiles.ReadMuch (dataSys.dbHeaderLength, fi, ADR(header));
IF (header.CatMagic # cHelpMagic) OR
(header.Version # cHelpVersion) OR
(header.VersionMagic # cHelpVersionMagic)
THEN
(* Index ist ungltig, neu aufbauen *)
CatFiles.CloseFile (fi);
succ := buildIdx (path, helpSize, f, helpIdx);
ELSE
CatFiles.ReadMuch (TSIZE (tHelpIdx), fi, ADR(helpIdx));
IF CatFiles.FileError < 0
THEN
CatFiles.ErrorAlert (CatFiles.FileError);
CatFiles.CloseFile (fi);
succ := buildIdx (path, helpSize, f, helpIdx);
ELSIF helpIdx.helpSize # helpSize
THEN
(* Index veraltet, neu aufbauen *)
CatFiles.CloseFile (fi);
succ := buildIdx (path, helpSize, f, helpIdx);
ELSE
CatFiles.CloseFile (fi);
succ := TRUE;
END;
END;
END;
(* Jetzt haben wir einen gltigen Index, nun mssen wir nur noch den
* Schlssel suchen
*)
IF succ & (helpIdx.helpOffset[which] < helpIdx.helpSize)
THEN
(* Auf richtige Position setzen *)
mtTextfiles.SetTextpos (f, helpIdx.helpOffset[which]);
ELSE
(* Schade, Schlssel kann nicht stimmen, also doch einfach suchen *)
(* Schlsselwort fr Suche bestimmen *)
MagicStrings.Assign (cHelpTable[which], helpKey);
(* Jetzt alle Zeilen nach dem Key durchsuchen *)
LOOP
(* Zeilen bis zum Anfang des Helptextes berspringen *)
mtTextfiles.ReadLine(f, skipString);
IF mtTextfiles.EndofText (f) THEN EXIT END;
IF MagicStrings.Pos (helpKey, skipString, 0, FALSE) < LENGTH (skipString)
THEN
(* Gefunden. In der nchsten Zeile geht es los *)
mtTextfiles.ReadLn (f);
EXIT
END;
mtTextfiles.ReadLn (f);
IF mtTextfiles.EndofText (f) THEN EXIT END;
END;
END;
MagicStrings.Assign (cHelpCode, helpKey);
Lists.CreateList (text, v.bool);
IF v.bool THEN
mtAppl.MouseArrow();
MTE.noMemAlert ();
RETURN FALSE
END;
LOOP
mtTextfiles.ReadLine(f, skipString);
IF MagicStrings.Pos (helpKey, skipString, 0, FALSE) < LENGTH (skipString)
THEN
(* Gefunden. Hilfetext ist nun zu Ende *)
EXIT
END;
NEW (str);
IF str = NIL THEN MTE.noMemAlert (); EXIT END;
MagicStrings.Assign (skipString, str^);
Lists.AppendEntry (text, str, v.bool);
IF v.bool THEN MTE.noMemAlert (); DISPOSE (str); EXIT END;
IF mtTextfiles.EndofText (f) THEN EXIT END;
mtTextfiles.ReadLn (f);
IF mtTextfiles.EndofText (f) THEN EXIT END;
END;
mtTextfiles.CloseTextfile (f);
mtAppl.MouseArrow();
RETURN TRUE;
END readHelp;
PROCEDURE lineToStr (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
VAR inf : CatTypes.Str127Ptr;
BEGIN
inf := CatTypes.Str127Ptr (entry);
IF inf = NIL THEN RETURN END;
MagicStrings.Assign (inf^, str);
END lineToStr;
PROCEDURE selEntry (entry, env: ADDRESS; line : INTEGER): BOOLEAN;
BEGIN
RETURN FALSE
END selEntry;
PROCEDURE isSelected (entry, env : ADDRESS) : BOOLEAN;
BEGIN
RETURN FALSE;
END isSelected;
PROCEDURE isEnabled (entry, env : ADDRESS) : BOOLEAN;
BEGIN
RETURN TRUE
END isEnabled;
PROCEDURE countEntries ( l : ADDRESS; VAR ll: LONGINT; VAR ww: INTEGER);
VAR lp : POINTER TO Lists.List;
BEGIN
lp := l;
ww := 0;
ll := VAL (LONGINT, Lists.NoOfEntries (lp^));
END countEntries;
PROCEDURE DeleteSimpleList (VAR l: Lists.List; killCarrier: BOOLEAN);
VAR entry: ADDRESS;
BEGIN
Lists.ResetList (l);
entry := Lists.PrevEntry (l);
WHILE entry # NIL DO
Lists.RemoveEntry (l, v.bool);
DEALLOCATE (entry, 0L);
entry := Lists.CurrentEntry (l);
END;
IF killCarrier THEN Lists.DeleteList (l, v.bool) END;
END DeleteSimpleList;
VAR tr : mtUtils.tObjcTree;
PROCEDURE drawHelpEntry (entry, env : ADDRESS; x, y : INTEGER;
offset : INTEGER; clip : GrafBase.Rectangle);
CONST spaceString = " ";
BEGIN
tr^[0].obX := x;
tr^[0].obY := y;
IF entry # NIL
THEN
(* Jetzt hier den String fr den Gruppennamen zusammenbauen *)
mtUtils.SetObjcStringAdr (tr, 0, ADDRESS(entry));
ELSE
mtUtils.SetObjcStringAdr (tr, 0, CADR(spaceString));
END;
MagicAES.ObjcDraw (tr, 0, 8, clip);
END drawHelpEntry;
PROCEDURE setAndGetHelpValues (tree: ADDRESS; private: ADDRESS; set: BOOLEAN; exitBut: INTEGER);
VAR l : tHelpPtr;
BEGIN
IF ~set
THEN
l := private;
DeleteSimpleList (l^.l, TRUE);
DISPOSE (l);
END;
END setAndGetHelpValues;
PROCEDURE internalDoHelp (topic: tHelp; doReadHelp: BOOLEAN; VAR externalHelp: Lists.List);
VAR l : tHelpPtr;
exit : INTEGER;
specials : ARRAY [0..0] OF ListDl.specialButHdler;
helpBox : ADDRESS;
maxLength: INTEGER;
r : GrafBase.Rectangle;
dialHandler: ListDl.ldHandler;
BEGIN
NEW (l);
IF l = NIL
THEN
MTE.noMemAlert();
RETURN
END;
helpBox := MausTauschrsc.TreeAddr^[MausTauschrsc.helpbox];
specials[0].objc := -99;
IF doReadHelp & ~readHelp (l^.l, topic)
THEN
RETURN
END;
IF ~doReadHelp
THEN
l^.l := externalHelp;
END;
(* Jetzt das Object zusammenbauen *)
mtUtils.CalcArea (helpBox, MausTauschrsc.hhelpbox, r);
maxLength := r.w DIV mtAppl.CharWidth;
(* Objectadresse holen *)
tr := MausTauschrsc.TreeAddr^[MausTauschrsc.listtxt];
tr^[0].obSpec.TedPtr^.teTxtlen := maxLength;
tr^[0].obWidth := maxLength*mtAppl.CharWidth;
mtUtils.SetState (tr, 0, MagicAES.SELECTED, FALSE);
mtUtils.SetState (tr, 0, MagicAES.DISABLED, FALSE);
(* WindowDialog vorbereiten *)
ListDl.BuildLdHandler (ADR(l^.l),
ListHelp.resetList,
ListHelp.nextEntry,
ListHelp.prevEntry,
countEntries,
isEnabled, selEntry,
lineToStr, isSelected,
drawHelpEntry,
0, mtAppl.CharHeight,
0, 0,
dialHandler);
(* ListWinDialog ffnen *)
IF ListDl.WinListDial (helpBox, ListDl.ldElemSet{ListDl.ldArrows, ListDl.ldModal},
dialHandler,
MausTauschrsc.hhelpbox,
MausTauschrsc.hhelpback,
MausTauschrsc.hok,
-1,
l, -1,
-1,
ListDl.dummyInLoop,
specials,
0,
ListDl.dummyCheckExit,
setAndGetHelpValues,
setAndGetHelpValues,
v.a)
THEN
END;
END internalDoHelp;
PROCEDURE DoHelp (topic: tHelp);
VAR externalHelp : BOOLEAN;
helpText : CatTypes.String255;
helpTopic : CatTypes.String255;
voidList : Lists.List;
BEGIN
(* Hilfe an Hilfesystem schicken *)
ConfVars.GetConfDefBool (cExternHelp, externalHelp, FALSE);
IF externalHelp
THEN
ConfVars.GetConfDefStr (cHyperText, helpText, "cat.hyp");
MagicStrings.Assign (cGuideHelpTable[topic], helpTopic);
(* SendExtendedHelp liefert FALSE zurck, falls das Hilfesystem
* ST-Guide nicht gefunden wurde
*)
externalHelp := Protokoll.SendExtendedHelp (helpTopic, helpText);
END;
(* Wenn der externe Aufruf nicht geklappt hat, dann wird hier
* noch die interne Hilfe aufgerufen
*)
IF ~externalHelp
THEN
internalDoHelp (topic, TRUE, voidList);
END;
END DoHelp;
PROCEDURE DoExternalHelp (VAR helpList: Lists.List);
BEGIN
internalDoHelp (general, FALSE, helpList);
END DoExternalHelp;
END CatHelp.